/*******************************************************************************
版权声明: Copyright(C) HT-Tech Co., Ltd. 2020-2021. All rights reserved.
文件名称: htprotocl.h
文件描述: 隧道协议接口声明
创 建 者: 陈位仅
创建时间: 2024年11月13日
修改历史:
1. 2024年11月13日   陈位仅      创建文件 
*******************************************************************************/
#ifndef _HTPROTOCOL__15882503819
#define _HTPROTOCOL__15882503819

// 数据类型
#define _HT_TYPE_PROXY_DATA         0x0000  // 代理数据包
#define _HT_TYPE_TUNNEL_DATA        0x0001  // 隧道数据包
#define _HT_TYPE_AUTH_REQUEST       0x0100  // 认证请求包
#define _HT_TYPE_AUTH_RESPONSE      0x0101  // 认证响应包
#define _HT_TYPE_CONFIG_PUSHING     0x0102  // 隧道配置推送包
#define _HT_TYPE_HEARTBEAT          0x0103  // 心跳包

// 默认版本号
#define _HT_VERSION     0x0001

// 隧道协议头定义
typedef struct ht_head_ {
    short ht_version;   // 版本号      
    short ht_len;       // 数据包长度
    short ht_type;      // 数据包类型
    char  ht_data[0];   // 数据包
} ht_head_t;

// 客户端认证请求包定义
typedef struct ht_auth_request_ {
    char ht_mode;       // 工作模式
    char ht_data[0];    // 数据包
} ht_auth_request_t;

// 客户端认证响应包定义
typedef struct ht_auth_response_ {
    int ht_result;      // 认证结果
    short ht_acl;       // 访问控制列表数量
    char ht_data[0];    // 数据包
} ht_auth_response_t;

// ACL控制列表类型
#define _HT_ACL_TYPE_IPv4         0x0001    // IPv4主机资源
#define _HT_ACL_TYPE_IPv4_Range   0x0002    // IPv4主机范围资源
#define _HT_ACL_TYPE_IPv4_Subnet  0x0003    // IPv4主机子网资源
#define _HT_ACL_TYPE_IPv6         0x0004    // IPv6主机资源
#define _HT_ACL_TYPE_IPv6_Range   0x0005    // IPv6主机范围资源
#define _HT_ACL_TYPE_IPv6_Subnet  0x0006    // IPv6主机子网资源

// IP ACL控制列表定义
typedef struct ht_acl_ip_ {
    char ht_type;      // 访问控制列表类型
    char ht_ip[40];    // IPv4/6地址
    short ht_port;     // IP端口
} ht_acl_ip_t;

// IP 范围 ACL控制列表定义
typedef struct ht_acl_range_ {
    char ht_type;       // 访问控制列表类型
    char ht_sip[40];    // IPv4/6起始地址
    short ht_sport;     // 起始端口
    char ht_eip[40];    // IPv4/6终止地址
    short ht_eport;     // 终止端口
} ht_acl_range_t;

// IP 子网 ACL控制列表定义
typedef struct ht_acl_subnet_ {
    char ht_type;       // 访问控制列表类型
    char ht_sip[40];    // IPv4/6起始地址
    short ht_sport;     // 起始端口
    short ht_preifx;    // 掩码位数
    short ht_eport;     // 终止端口
} ht_acl_subnet_t;

// 配置推送包定义
typedef struct ht_cfg_push_ {
    short ht_cfg_cnt;   // 配置项数量
    char ht_data[0];    // 数据包
} ht_cfg_push_t;

// 配置列表定义(指令/参数)
typedef struct ht_cfg_item_ {
    short ht_item_len;      // 配置项长度
    char ht_item_data[0];   // 数据包
} ht_cfg_item_t;

//*************************************************************
// 接口名: htprc_request
// 返回值: 0 成功, -1 失败
// 参  数: pCfg:终端配置信息 [IN]
//         pOut:输出数据包 [OUT]
//         pLen:输入时为输出数据BUFFER长度,输出时为数据包长度 [IN/OUT]
// 描  述: 封装终端认证请求包
//*************************************************************
int htprc_request(IN ht_cfg_t *pCfg, OUT char *pOut, OUT int *pLen);

//*************************************************************
// 接口名: htprc_respone
// 返回值: 0 成功, -1 失败
// 参  数: pIN:输入数据包 [IN]
//         pLen:输入数据包长度 [IN]
// 描  述: 终端认证响应包解析
//*************************************************************
int htprc_respone(IN char *pIN, IN int Len);

//*************************************************************
// 接口名: htprc_config
// 返回值: 0 成功, -1 失败
// 参  数: pCfg:终端配置信息 [IN]
//         pIN:输入数据包 [IN]
//         pLen:输入数据包长度 [IN]
// 描  述: 配置推送包解析
//*************************************************************
int htprc_config(IN ht_cfg_t *pCfg, IN char *pIN, IN int Len);

//*************************************************************
// 接口名: htprc_heartbeat
// 返回值: 0 成功, -1 失败
// 参  数: pOut:输出数据包 [OUT]
//         pLen:输入时为输出数据BUFFER长度,输出时为数据包长度 [IN/OUT]
// 描  述: 心跳报文封装
//*************************************************************
int htprc_heartbeat(OUT char *pOut, OUT int *pLen);

//*************************************************************
// 接口名: htprc_data
// 返回值: NULL    失败
//        非NULL   成功,新生数据包指针
// 参  数: pOut:输出数据包,pOut前需预留16字节存储长度 [OUT]
//         pLen:输入时为输出数据BUFFER长度,输出时为数据包长度 [IN/OUT]
//         type:数据包类型 [IN]
// 描  述: 数据报文封装
//*************************************************************
char *htprc_data(OUT char *pOut, OUT int *pLen, IN short type);
#endif // _HTPROTOCOL__15882503819
